package com.xuexi.mashibing;

import org.openjdk.jol.info.ClassLayout;

/**
 * synchronized 实现原理
 *
 * synchronized的一把基于对象的锁，所以它的实现是基于对象的
 * 一个对象的大致包括了：对象头、实例数据、补全位
 * 对象头又分为：MarkWord、InstanceData
 * MarkWord 由8个字节组成，低位的后2~3位对应synchronized的锁的不同级别
 *
 * 001 无锁状态：当前对象没有作为锁存在
 * 101 偏向锁：如果当前锁资源只有一个线程频繁的获取释放，当一个线程过来后判断当前线程是不是我自己，如果是直接获取锁，如果不是尝试将偏向锁指向当前线程，如果获取不到锁触发锁升级，升级为轻量级锁
 * 00：轻量级锁：采取自旋锁CAS频繁的尝试获取锁，获取一定次数后任然获取不到，锁升级为重量级锁
 * 10：重量级锁：就是传统的synchronized锁，获取不到就挂起线程
 * 11：gc 标记位
 *
 */
public class SynchronizedPrinciple {


    public static void main(String[] args) {

        Object o = new Object();
        System.out.println("初始对象信息：" + ClassLayout.parseInstance(o).toPrintable());

        synchronized (o) {
            System.out.println("001-无锁状态\n" + ClassLayout.parseInstance(o).toPrintable());
        }
        printObjectLayout(o);
    }

    private static synchronized void printObjectLayout(Object o) {
        System.out.println("001-无锁状态\n" + ClassLayout.parseInstance(o).toPrintable());
    }

}
